package redis

import (
	"bluebell/models"
	"github.com/go-redis/redis"
	"go.uber.org/zap"
	"strconv"
	"time"
)

func GetCommunityIDWithOrderkey(p *models.ParamPostListWithCommunity, offset int64) ([]string, error) {
	// 根据排序规则从 redis获取 帖子ID列表 增加 通过社区ID进行筛选

	// 首先在redis 中创建此次查询的缓存键

	key := KeyPostTimeZSet
	if p.OrderKey != models.OrderWithTime {
		key = KeyPostScoreZSet
	}
	//v := reflect.TypeOf(p.CommunityID)

	v := strconv.Itoa(int(p.CommunityID))

	tempKey := key + v
	//fmt.Println(v)

	if rdb.Exists(tempKey).Val() < 1 {
		// 放在一个管道中执行
		pipeline := rdb.Pipeline()

		pipeline.ZInterStore(tempKey, redis.ZStore{
			Aggregate: "MAX",
		}, KeyCommunitySet+strconv.Itoa(int(p.CommunityID)), key) // 第一个 key按照社区为单位存储帖子，第二个为按照排序规则存储帖子的key
		pipeline.Expire(tempKey, 60*time.Second) // 设置超时时间

		_, err := pipeline.Exec()

		if err != nil {
			zap.L().Error("设置社区缓存KEY失败！", zap.Error(err))
			return nil, err
		}

	}

	// 假定每页有三条数据
	// (offset-1)*3
	// 从缓存的 key中查询数据
	//fmt.Println("------------------------------------------")
	return rdb.ZRevRange(tempKey, (offset-1)*3, (offset-1)*3+2).Result()

}

func GetPostIDWithOrderKey(p *models.ParamPostList, offset int64) ([]string, error) {
	// 根据排序规则从 redis获取 帖子ID列表
	key := KeyPostTimeZSet
	if p.OrderKey != models.OrderWithTime {
		key = KeyPostScoreZSet
	}

	// 假定每页有三条数据
	// (offset-1)*3
	// ZRevRangeWithScores
	return rdb.ZRevRange(key, (offset-1)*3, (offset-1)*3+2).Result()

}

func GetPostVotedData(ids []string) (countList []int64, err error) {
	pipeline := rdb.TxPipeline() // 减少 RTT
	countList = make([]int64, 0, len(ids))
	for _, id := range ids {
		// 根据id 拿取投票数
		// zcount 返回分数范围内的成员数量
		pipeline.ZCount(KeyPostVoted+id, "1", "1")

	}
	cmders, err := pipeline.Exec()
	for _, cmder := range cmders {
		countList = append(countList, cmder.(*redis.IntCmd).Val()) // 类型断言
	}
	if err != nil {
		zap.L().Error("根据帖子ID到redis查询正投票数量失败", zap.Error(err))
		return
	}

	return
}
